package br.com.main.server;

import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import br.com.main.client.ComunServico;
import br.com.main.client.system.botoes.Denuncia;
import br.com.main.client.system.botoes.Morador;
import br.com.main.client.system.botoes.Notificacao;
import br.com.main.client.system.botoes.Reserva;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class ComunServicoImpl extends RemoteServiceServlet implements
ComunServico {

	private ConnectionFactory fc;
	private Usuario usuario;

	public ComunServicoImpl() {
		fc = new ConnectionFactory();
		usuario = new Usuario();
	}

	@Override
	public String logInSindico(String login, String senha) {
		String sql;

		sql = "SELECT cpf FROM Pessoa WHERE login = '" + login
				+ "' AND senha = '" + senha + "'";
		usuario.setCpf(fc.getAlgo(sql));
		System.out.println(usuario.getCpf());
		sql = "SELECT cnpj FROM Condominio WHERE cpf_sindico = '"
				+ usuario.getCpf() + "'";
		usuario.setCnpj(fc.getAlgo(sql));
		System.out.println(usuario.getCnpj());

		return fc.logarSindico(login, senha, usuario.getCnpj());
	}

	@Override
	public ArrayList<Morador> listarMoradores() {
		return fc.carregarMoradores(usuario.getCnpj(), usuario.getCpf());
	}
	
	@Override
	public String recuperarSenha(String email) {
		String retorno = "";
		MailUtils enviar = new MailUtils();

		
		String[] dados = fc.recuperarSenha(email);
		
		if(dados == null){
			retorno = "Email não encontrado";
		}
		else{
			enviar.enviarEmail(email, dados[0], dados[2], dados[1]);
			retorno = "Enviado com sucesso";
			
		}
		
		return retorno;
	}

	@Override
	public String cadastroSindicoCondominio(String cpf, String nome,
			String login, String senha, String email, String telefone,
			String data_nasc, String data_mandato, String cnpj, String cep,
			String estado, String cidade, String bairro, String rua,
			int numero, String complemento) {
		
		return fc.cadastrarSindicoCondominio(cpf, nome, login, senha, email,
				telefone, data_nasc, data_mandato, cnpj, cep, estado, cidade,
				bairro, rua, numero, complemento);
	}

	@Override
	public String cadastroAreaLazer(String nome, String capacidade, String tempoMaximo){

		return fc.cadastroAreaLazer(nome, capacidade, tempoMaximo, usuario.getCnpj());
	}
	@Override
	public String cadastroMorador(String nome, String cpf, String email,
			String telefone, String data_nasc, String numero, String bloco,
			String andar) {
		return fc.cadastroMorador(nome, cpf, email, telefone, data_nasc,
				numero, bloco, andar, usuario.getCnpj());
	}

	@Override
	public String[] getSindico() {
		String[] result = null;
		try {
			result = fc.getSindico(this.usuario.getCpf());
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}

	@Override
	public List<String[]>carregarAreaLazer(){

		return fc.carregarAreaLazer(usuario.getCnpj());

	}

	public void updateSindico(String[] novosDados) {
		try {
			fc.updateSindico(novosDados, this.usuario.getCpf());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public String logInMorador(String login, String senha, String cnpj) {
		usuario.setCnpj(cnpj);
		String retorno = fc.logarMorador(login, senha, cnpj);
		if (!retorno.equals("False")) {
			usuario.setCpf(retorno);
			return "True";
		} else {
			return "False";
		}
	}

	@Override
	public ArrayList<Reserva> carregaReservas() {

		ArrayList<Reserva>res = new ArrayList<Reserva>();
		try {
			res =  fc.listReservas(this.usuario.getCnpj());
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return res;
	}

	@Override
	public List<String[]> carregarDespesas(){

		return fc.carregarDespesas(usuario.getCnpj());

	}

	@Override
	public String cadastroDespesa(String valor,String descricao,String data,String pago){
		System.out.println(descricao +" "+ valor+" "+ data+" "+ usuario.getCnpj()+" "+ pago);
		return fc.cadastroDespesa(descricao, valor, data, usuario.getCnpj(), pago);


	}

	@Override
	public String cadastraReserva(int idArea, String dataRes) {

		return fc.cadastraReserva(idArea, dataRes, this.usuario.getCnpj(), this.usuario.getCpf());

	}

	@Override
	public ArrayList<Notificacao> carregaNotificacoes() {
		ArrayList<Notificacao>notificacoes = new ArrayList<Notificacao>();
		try {
			notificacoes = fc.carregaNotificacoes(this.usuario.getCpf());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return notificacoes;
	}

	@Override
	public ArrayList<Denuncia> carregaDenuncia() {
		ArrayList<Denuncia>denuncias = new ArrayList<Denuncia>();
		try {
			denuncias = fc.carregaDenuncias(this.usuario.getCpf());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return denuncias;
	}

	@Override
	public void excluirMorador(String cpf) {
		fc.excluirMorador(cpf);
	}

	@Override
	public String[] carregaDadosMorador() {
		String[] dados = null;

		try {
			dados = fc.carregaDadosMorador(this.usuario.getCpf());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return dados;
	}

	@Override
	public void updateMorador(String[] novosDados) {

		try {
			fc.updateMorador(novosDados, this.usuario.getCpf());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public String pegarFormulario(){

		String retorno = "";
		System.out.println(usuario.getCpf() + " ---  ----"+usuario.getCnpj());

		retorno = parse(fc.dadosFormularioMorador(usuario.getCpf(), usuario.getCnpj()));

		System.out.println(retorno);
		return retorno;

	}

	private String parse(String[] strings) {
		String retorno =  Constans.formulario;

		retorno = retorno.replace("{$EmailSindico}", strings[0]);
		retorno = retorno.replace("{$NomeMorador}", strings[1]);
		retorno = retorno.replace("{$CEPMorador}", strings[2]);
		retorno = retorno.replace("{$TelefoneMorador}", strings[3]);
		retorno = retorno.replace("{$EmailMorador}", strings[4]);

		return retorno;
	}

	@Override
	public String customFormat(String value) {

		String pattern = "###.00";
		value =  value.replace(",", ".");
		Double valor = new Double(value);
		DecimalFormat myFormatter = new DecimalFormat(pattern);
		String output = myFormatter.format(valor);
		output =  output.replace(",", ".");
		System.out.println(value + "  " + pattern + "  " + output);

		return output;
	}

	@Override
	public ArrayList<Reserva> carregaHistoricoReservas() {
		ArrayList<Reserva>historico = new ArrayList<Reserva>();

		try {
			historico = fc.listHistorico(this.usuario.getCpf());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return historico;
	}
	
	@Override
	public String atualizaMorador(String nome, String cpf, String email,
			String telefone, String data_nasc, String numero, String bloco,
			String andar) {
		return fc.atualizaMorador(nome, cpf, email, telefone, data_nasc, numero, bloco, andar);
	}

	@Override
	public void fazerNotificacao(String[] dados) {
		
		fc.fazerNotificacao(dados, this.usuario.getCpf());
		
	}

	@Override
	public String[] getCpfSindico() {
		return fc.getCpfSindico(this.usuario.getCpf()); 
	}
}
